import { ActionSpec } from "../Actuators/ActionSpec";
import { ActionBuffers } from "../Actuators/IActionReceiver";
import { AgentInfo } from "../Agent";
import { ISensor } from "../Sensors/ISensor";
import { CCCRLCapabilities } from "./CCCRLCapabilities";


/**
 * 通信初始化参数
 */
export class CommunicatorInitParameters {

    /**
     * 连接端口
     */
    port: number = 0;
    /**
     * 环境名称
     */
    name: string = "";
    /**
     * sdk版本
     * */
    packageVersion: string = "";
    /** 通信版本 */
    communicationVersion: string = "";

    /** 强化学习能力*/
    cccCapabilities: CCCRLCapabilities = null!;

}

/**
 * 强化学习初始化参数
 */

export class CCCRLInitParameters {

    /** python发送过来的随机种子 */
    seed: number = 0;

    /** 如果在场景中用于训练区域复制，则是复制区域的数量 */
    numAreas: number = 0;

    /** python进程版本 */
    pythonLibraryVersion: string = "";

    /** python通信版本 */
    pythonCommunicationVersion: string = "";

    /** 训练器的能力 */
    trainerCapabilities: CCCRLCapabilities = null!;

}

/**
 * 强化学习输入参数
 */
export class CCCRLInputParameters {

    isTraining: boolean = false;
}

/**
 * 退出命令处理程序
 */
export type QuitCommandHandler = () => void;

/**
 * 重置命令处理程序
 */
export type ResetCommandHandler = () => void;

/**
 * 强化学习输入接收处理程序
 */
export type RLInputReceivedHandler = (inputParams: CCCRLInputParameters) => void;

/**
 * 通信器接口定义了与外部通信的方法和事件。
 */
export interface ICommunicator {

    /**
     * 当接收到退出命令时触发的事件处理程序。
     */
    quitCommandReceived: QuitCommandHandler | null;

    /**
     * 当接收到重置命令时触发的事件处理程序。
     */
    resetCommandReceived: ResetCommandHandler | null;

    /**
     * 初始化通信器。
     * @param initParameters - 初始化参数。
     * @returns 初始化是否成功。
     */
    initialize(initParameters: CommunicatorInitParameters): Promise<[boolean,CCCRLInitParameters]>;

    /**
     * 订阅指定名称的智能体的动作规范。
     * @param name - 智能体名称。
     * @param actionSpec - 动作规范。
     */
    subscribeBrain(name: string, actionSpec: ActionSpec): void;

    /**
     * 将观测数据发送给指定智能体。
     * @param brainKey - 智能体键。
     * @param info - 智能体信息。
     * @param sensors - 传感器列表。
     */
    putObservations(brainKey: string, info: AgentInfo, sensors: ISensor[]): void;


    getActions(brainKey: string, agentId: number): ActionBuffers;

    /**
     * 请求批量决策。
     */
    decideBatch(): void;
}






